import java.util.HashSet;  
import java.util.Random;  
import java.util.Set;  
  
public class UniqueCodeGenerator {  
    private final Set<String> cacheCodes = new HashSet<>();  
    private long seq = 1;  
    private final Random random = new Random();

    long maxBound = 9999999L;
    public long getRandomLong(long min, long max) {
        long d = max - min + 1;
        return min + random.nextLong() % d;
    }
  
    public String generateCode(long businessId) {  
        // 确保businessId只使用低3位  
        long typeBits = businessId & 0x7; // 00000000 00000000 00000000 00000111  
        // 生成24位随机数
        long randomBits = (long) (getRandomLong(1, maxBound) );
        System.out.println(randomBits);
        // 确保序列号在0到8191之间循环  
        long seqBits = (seq & 0x1FFF) << 3; // 00000000 00000000 00011111 11111000

        // 拼接所有部分  
        long fullBits = randomBits<<16 | seqBits | typeBits;

        System.out.println(fullBits);
  
        // 转换为字符串（如果需要，也可以保持为long类型）
        String code = Long.toString(fullBits, 2);
        if(code.length() > 40) {
            code = code.substring(code.length() - 40);
        }


        // 检查是否已存在，如果不存在则添加并返回，否则递归调用  
        if (!cacheCodes.add(code)) {  
            seq++; // 尝试下一个序列号（注意：这里在递归前递增，但递归时可能已重置）  
            return generateCode(businessId);  
        }

        seq++; // 更新序列号（在返回后递增，确保下次调用时使用新序列号）  
  
        return code;  
    }  
  
    public static void main(String[] args) {  
        UniqueCodeGenerator generator = new UniqueCodeGenerator();  
        // 示例：生成一个code  
        String code = generator.generateCode(2); // 假设商品类型为1（二进制001）
        System.out.println(code); // 输出类似于"010101..."（40位二进制字符串）  
    }  
}